import { generateParentheses } from '../generateparentheses'

const cases: [number, string[]][] = [
  [0, ['']],
  [1, ['()']],
  [2, ['(())', '()()']],
  [3, ['((()))', '(()())', '(())()', '()(())', '()()()']],
  [
    4,
    [
      '(((())))',
      '((()()))',
      '((())())',
      '((()))()',
      '(()(()))',
      '(()()())',
      '(()())()',
      '(())(())',
      '(())()()',
      '()((()))',
      '()(()())',
      '()(())()',
      '()()(())',
      '()()()()'
    ]
  ],
  [
    5,
    [
      '((((()))))',
      '(((()())))',
      '(((())()))',
      '(((()))())',
      '(((())))()',
      '((()(())))',
      '((()()()))',
      '((()())())',
      '((()()))()',
      '((())(()))',
      '((())()())',
      '((())())()',
      '((()))(())',
      '((()))()()',
      '(()((())))',
      '(()(()()))',
      '(()(())())',
      '(()(()))()',
      '(()()(()))',
      '(()()()())',
      '(()()())()',
      '(()())(())',
      '(()())()()',
      '(())((()))',
      '(())(()())',
      '(())(())()',
      '(())()(())',
      '(())()()()',
      '()(((())))',
      '()((()()))',
      '()((())())',
      '()((()))()',
      '()(()(()))',
      '()(()()())',
      '()(()())()',
      '()(())(())',
      '()(())()()',
      '()()((()))',
      '()()(()())',
      '()()(())()',
      '()()()(())',
      '()()()()()'
    ]
  ]
]

describe('Generate Parentheses', () => {
  test.each(cases)(
    'generate all valid parentheses of input %n',
    (n: number, expected: string[]) => {
      expect(generateParentheses(n)).toStrictEqual(expected)
    }
  )
})
